﻿// Copyright 2022 Huawei Cloud Computing Technology Co., Ltd.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#ifndef CLOUDAPPSDK_WINDOWS_H
#define CLOUDAPPSDK_WINDOWS_H

#define EXPORT_DLL __declspec(dllexport)

#include <string>
#include <map>

extern "C" {
typedef void *(*StatusCallback)(std::string instanceId, int type, std::string msg);
typedef void (*AudioDataCallback)(std::string instanceId, uint8_t *data, uint32_t length);
typedef void (*VideoDataCallback)(std::string instanceId, uint8_t *data, uint32_t length, uint32_t width, uint32_t height);

class CloudAppSDK_Windows {
public:
    CloudAppSDK_Windows();
    virtual ~CloudAppSDK_Windows();

    /**
     * 初始化，初始化连接业务参数
     * @param instanceId   实例id, 回调函数回带
     * @param paramConfig  参考 CloudAppCommon.h 中的 paramConfig 相关 KEY, 必选
     * @param mediaConfig  参考 CloudAppCommon.h 中的 mediaConfig 相关 KEY, 非必选，可为空map
     * @return 0：success -1: fail
     */
    int Init(std::string instanceId,
             std::map<std::string, std::string> paramConfig,
             std::map<std::string, std::string> mediaConfig);

    /**
     * 启动，开始接入云手机
     * @return 0：success -1: fail
     */
    int Start();

    /**
     * 停止，断开云手机连接
     * @return 0：success -1: fail
     */
    int Stop();

    /**
     * 暂停，停止音视频出流
     * （说明: 此操作与 paramConfig 中的 backgroundTimeout 相关， pause 超过 backgroundTimeout 时长会进行 CAS_HOME_TIMEOUT 状态回调）
     * @return 0：success -1: fail
     */
    int Pause();

    /**
     * 恢复，开始音视频出流
     * @return 0：success -1: fail
     */
    int Resume();

    /**
     * 发起重连
     * （说明: 运行时网络异常出现断连后内部会自动重连3次，超过3次重连失败会进行 CAS_CONNECT_LOST 状态回调，上层可以选择是否再次重连）
     * @return 0：success -1: fail
     */
    int Reconnect();

    /**
     * 反初始化，释放并销毁资源，调用此接口前，确保已经调用了Stop
     * @return 0：success -1: fail
     */
    int Deinit();

    /**
     * 发送触摸事件
     * @param id 触摸点id，区分多点触摸（同android设备）
     * @param action 触摸动作
     * @param x 触摸点坐标X
     * @param y 触摸点坐标Y
     * @param pressure 压力值（同android设备）
     * @param time 触摸事件发生时间戳
     * @param orientation 屏幕方向（同android设备，竖屏 0、横屏1）
     * @param height 渲染区域高度
     * @param width 渲染区域宽度
     * @return 0：success -1: fail
     */
    int SendTouchEvent(int id, int action, int x, int y, int pressure, long time, int orientation, int height, int width);

    /**
     * 发送按键事件（同android设备的标准按键值）
     * @param keycode 按键code
     * @param action 按键action
     * @return 0：success -1: fail
     */
    int SendKeyEvent(uint16_t keycode, uint16_t action);

    /**
     * 动态设置媒体参数
     * @param mediaConfig 参考 CloudAppCommon.h 中的 mediaConfig 相关 KEY
     * @return 0：success -1: fail
     */
    int SetMediaConfig(std::map<std::string, std::string> mediaConfig);

    /**
     * 请求关键帧
     * @return 0：success -1: fail
     */
    int ForceIFrame();

    /**
     * 注册状态监听回调
     * @param callback
     */
    void RegistStateCallback(StatusCallback callback);

    /**
     * 注册视频流数据回调（YUV420）
     * @param callback
     */
    void RegistVideoStreamCallback(VideoDataCallback callback);

    /**
     * 注册音视频流数据回调（PCM）
     * @param callback
     */
    void RegistAudioStreamCallback(AudioDataCallback callback);

private:
    class CloudAppSDKPri;
    CloudAppSDKPri *m_cloudAppPri;
};

}

#endif //CLOUDAPPSDK_WINDOWS_H
